#ifndef _VIEWER_H_
#define _VIEWER_H_

#include <cairo.h>
#include <gtkmm.h>

#include <gtk/gtk.h>
#include <gtk/gtkgl.h>
#include <gdk/gdkglglext.h>
#include <glibmm.h>

#include <GL/gl.h>
#include <GL/glu.h>

#include <vector>
#include "feld.h"

class Feld;

typedef struct{
   GLubyte r, g, b, a;
    GLfloat  x,y;
}Point;

class Viewer{
    Point* Pointarr;
    Point* Gitarr;
    Gtk::Window *window;
    GtkWidget *         drawing_area_old;
    Gtk::DrawingArea *drawing_area;
    Cairo::RefPtr<Cairo::Context> buffer;
    //Cairo::RefPtr<Cairo::Context> buffer_new;
    Cairo::RefPtr<Cairo::Context> show;
    Cairo::RefPtr<Cairo::Surface> surface;
    //Cairo::RefPtr<Cairo::Surface> surface_new;
    Cairo::Matrix *matxx;
    int cordx, cordy;
    Gtk::Adjustment *adjx,*adjy,*adjzoom;
    long fieldx, fieldy;
    double actualscale;
    Glib::Mutex *give_me_next_number_mutex;
    int maxresolx,maxresoly;
    int mausxold, mausyold;
    //test
    //bool **feld;
    //std::vector<bool> feldd;
    Feld *  fald;
   
/**
* @brief berechnet die feldkoordinaten der mauspositon
*
* ausgehend von der mausposition auf dem fenster, wird
* die feldposition ermittelt
*/
    int mouse_to_field(int mausx, double scrx, int dimfield,int verschiebungx,int fieldx);
   
    int minab(int a, int b);
   
    int init_gitarr(int aa, int bb);
   
    int init_pointarr(int aa,int bb,int xuz,int yuz);
   
    int init_pointarr_mouse(int aa,int bb,int xuz,int yuz, int mousexx, int mouseyy);
   
    void init_opengl();
   
    void init_field(long x, long y);
    void destroy_field();
    void clear_gl_field();    
   
public:
    
     bool get_field(int x, int y);
    void set_field(int x, int y, bool val); 
    void set_field_random(double warsch);    
/**
* @brief berechnungs-buffer zeichnen
*
* hier wird mithilfe des feldes auf den berechnungs-buffer gemalt
*/    
    void calcultate(int x,int y) ;
   
/**
* @brief kopiert den berechnungs-buffer in den zeichenbuffer
*
*
*/    
    void swapbuffer(Feld * f);
   void setfeld();
   
   void redraw();
   
   void openglswapbuffers(GdkGLDrawable *gldrawable);
   
   
/**
* @brief refresh der drawing-area
*
* hier wird die drawing area neu anhand des zeichenbuffers gemalt
*/  


    void showme();
   
   
    void mausmove(int mausx, int mausy);
   
   
    void saveclick(int mausx, int mausy);


    void setfielddim(long x, long y);
   
/**
* @brief konstruktor
*
* speichert die ganzen daten, die der viewer staendig braucht
* und erstellt seine zeichen-"buffer"
*/
    Viewer(Gtk::Window *window,GtkWidget *  drawing_area,Gtk::Adjustment *adjxx,Gtk::Adjustment *adjyy,Gtk::Adjustment *adjzz, int maxxdim, int maxydim);

   
   
   
    };



#endif
